package com.tom.commonframework.common.refreshview.base;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import com.tom.commonframework.R;

import java.util.List;

/**
 * Created by TomLeisen on 2018/7/23 上午10:51
 * Email: xy162162a@163.com
 * Description:
 */
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {

    private static final int NORMAL_TYPE = 1;//正常类型
    private static final int FOOT_TYPE = 2;//底部加载完成

    protected Context context;
    private int layoutId;
    private int footLayoutId;
    private List<T> mDatas;//数据集合
    private LayoutInflater inflater;
    private boolean isLastView = false;


    /**
     * 使用默认的已加载完成布局
     *
     * @param context  上下文Id
     * @param layoutId 正常布局Id
     */
    public BaseAdapter(Context context, int layoutId) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.layoutId = layoutId;
        this.footLayoutId = R.layout.refreshview_pull_to_refresh_footer2;
    }

    /**
     * 使用自定义的底部布局
     *
     * @param context      上下文
     * @param layoutId     正常布局Id
     * @param footLayoutId 底部布局Id
     */
    public BaseAdapter(Context context, int layoutId, int footLayoutId) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.layoutId = layoutId;
        this.footLayoutId = footLayoutId;
    }

    /**
     * 适配器数据集合
     *
     * @param datas 数据集合
     */
    public void setData(List<T> datas) {
        mDatas = datas;
        notifyDataSetChanged();
    }

    /**
     * 翻页时给数据集合添加数据
     *
     * @param addDatas 数据集合
     */
    public void addDataList(List<T> addDatas) {
        if (addDatas != null) {
            mDatas.addAll(addDatas);
        }
        notifyDataSetChanged();
    }


    /**
     * 是否最后一页
     *
     * @param lastView true 是  false 否
     */
    public void setIsLastView(boolean lastView) {
        isLastView = lastView;
        notifyDataSetChanged();
    }

    /**
     * 是否最后一页  true 是  false 否
     * 此方法为--已加载至数据最后一条时(数据已全部加载完成)拦截继续数据绑定，有效减少内存开销
     */
    public boolean isLastView() {
        return isLastView;
    }

    /**
     * 创建实例
     *
     * @param parent   parent
     * @param viewType viewType
     */
    @Override
    public BaseViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
        BaseViewHolder baseViewHolder = null;
        switch (viewType) {
            case NORMAL_TYPE:
                baseViewHolder = BaseViewHolder.createViewHolder(context, parent, layoutId);
                break;
            case FOOT_TYPE:
                baseViewHolder = BaseViewHolder.createViewHolder(context, parent, footLayoutId);
                break;
        }
        return baseViewHolder;
    }

    /**
     * 处理数据
     *
     * @param holder   holder
     * @param position position
     */
    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        if (holder.getItemViewType() == NORMAL_TYPE) {
            onBindViewHolder(holder, mDatas.get(position));
        } else {
            onBindFootViewHolder(holder);
        }

    }

    public abstract void onBindViewHolder(BaseViewHolder holder, T t);

    public abstract void onBindFootViewHolder(BaseViewHolder holder);

    /**
     * 数据绑定
     */
    @Override
    public int getItemCount() {
        if (isLastView) {
            return mDatas == null ? 0 : mDatas.size() + 1;
        } else {
            return mDatas == null ? 0 : mDatas.size();
        }
    }


    /**
     * 设置不同的布局类型
     *
     * @param position position
     */
    @Override
    public int getItemViewType(int position) {
        if (isLastView) {
            if (position == getItemCount() - 1) {
                return FOOT_TYPE;
            } else {
                return NORMAL_TYPE;
            }
        } else {
            return NORMAL_TYPE;
        }
    }

}